/**
 * 接口还能够使用继承进行合并，在继承时子接口可以声明同名属性，但并不能覆盖掉父接口中的此属性。
 * 子接口中的属性类型需要能够兼容（extends）父接口中的属性类型：
*/
interface Struct1 {
    primitiveProp: string;
    objectProp: {
        name: string;
    };
    unionProp: string | number;
}

// 接口“Struct2”错误扩展接口“Struct1”。
interface Struct2 extends Struct1 {
    // “primitiveProp”的类型不兼容。不能将类型“number”分配给类型“string”。
    primitiveProp: number;
    // 属性“objectProp”的类型不兼容。
    objectProp: {
        age: number;
    };
    // 属性“unionProp”的类型不兼容。
    // 不能将类型“boolean”分配给类型“string | number”。
    unionProp: boolean;
}

/**
 * 类似的，如果直接声明多个同名接口，虽然接口会进行合并，
 * 但这些同名属性的类型仍然需要兼容，此时的表现其实和显式扩展接口基本一致：
*/

interface StructA {
    primitiveProp: string;
}

interface StructA {
    // 后续属性声明必须属于同一类型。
    // 属性“primitiveProp”的类型必须为“string”，但此处却为类型“number”。
    primitiveProp: number;
}

/**
 * 接口 和 类型别名 之间的合并：
 * 其规则和上面规则一致
*/
type Base = {
    name: string;
};

interface IDerived extends Base {
    // 报错！就像继承接口一样需要类型兼容
    name: number;
    age: number;
}

interface IBase {
    name: string;
}

// 合并后的 name 同样是 never 类型
type Derived = IBase & {
    name: number;
};

//export {}：解决“无法重新声明块范围变量”错误提示问题
export { }